package br.com.eduquiz.session;

import br.com.eduquiz.entity.*;
import br.com.eduquiz.util.Tools;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.NoResultException;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.framework.EntityHome;
import org.jboss.seam.international.StatusMessage.Severity;
import org.jboss.seam.log.Log;

@Name("usuarioHome")
public class UsuarioHome extends EntityHome<Usuario> {
	
	private static final long serialVersionUID = -5471363864503910905L;
	
	@Logger
	private Log log;
	
	@In(create = true)
	private SubGrupoHome subGrupoHome;

	@In
	private FacesMessages facesMessages;
	
	@Override
	public String persist() {
		String senha = getInstance().getSenha();
		String confirmarSenha = getInstance().getConfirmarSenha();
		
		if (senha.equals(confirmarSenha)) {
			senha = Tools.encriptar(senha);
			
			getInstance().setSenha(senha);
			getInstance().setDataCadastro(Calendar.getInstance());
			
			if (getInstance().getSubGrupo() == null) {
				setSubGrupo();
			}
			
			return super.persist();
		} else {
			facesMessages.addFromResourceBundle(Severity.ERROR, "utils_Senhas_diferentes");
			return "failed";
		}
	}
	
	@Override
	@Restrict("#{s:hasRole('Subgrupo') or permissao.usuarioSessao}")
	public String update() {
		String senha = getInstance().getSenha();
		String confirmarSenha = getInstance().getConfirmarSenha();
		
		if (!confirmarSenha.equals("") && !confirmarSenha.equals(null)) {
		
			if (senha.equals(confirmarSenha)) {
				getInstance().setSenha(Tools.encriptar(senha));
				return super.update();
			}
		}
		
		facesMessages.addFromResourceBundle(Severity.ERROR, "utils_Senhas_diferentes");
		return "failed";
	}
	
	@Override
	@Restrict("#{s:hasRole('Subgrupo') or permissao.usuarioSessao}")
	public String remove() {
		return super.remove();
	}
	
	public void setSubGrupo() {
		log.info("Usuário não possui Subgrupo settado, buscando SubGrupo padrão");
		
		try {
			SubGrupo subgrupo = (SubGrupo) getEntityManager().createQuery("FROM SubGrupo sg WHERE sg.padrao = :padrao")
				.setParameter("padrao", true)
				.getSingleResult();
			
			getInstance().setSubGrupo(subgrupo);
		} catch (NoResultException e) {
			log.info("Subgrupo padrão não encontrado, settando o primeiro subgrupo encontrado");
			SubGrupo subgrupo = (SubGrupo) getEntityManager().createQuery("FROM SubGrupo sg")
			.getResultList()
			.get(0);
			
			getInstance().setSubGrupo(subgrupo);
		}
	}
	
	public void setUsuarioId(Long id) {
		setId(id);
	}

	public Long getUsuarioId() {
		return (Long) getId();
	}

	@Override
	protected Usuario createInstance() {
		Usuario usuario = new Usuario();
		return usuario;
	}

	public void load() {
		if (isIdDefined()) {
			wire();
		}
	}

	public void wire() {
		getInstance();
		SubGrupo subGrupo = subGrupoHome.getDefinedInstance();
		if (subGrupo != null) {
			getInstance().setSubGrupo(subGrupo);
		}
	}

	public boolean isWired() {
		return true;
	}

	public Usuario getDefinedInstance() {
		return isIdDefined() ? getInstance() : null;
	}

	public List<Categoria> getCategoria() {
		return getInstance().getCategoria() == null ? null : new ArrayList<Categoria>(
				getInstance().getCategoria());
	}

	public List<Questionario> getQuestionario() {
		return getInstance() == null ? null : new ArrayList<Questionario>(
				getInstance().getQuestionario());
	}
}
